#include <iostream>
#include <jsoncpp/json/json.h>  // 引入JsonCpp库头文件，用于处理JSON数据
using namespace std;

int main()
{
    // 序列化部分：将C++数据结构转换为JSON格式字符串
    cout << "==================序列化==================" << endl;
    
    // 创建一个JSON子对象part1，用于存储部分键值对
    Json::Value part1;
    part1["hello"] = "hello";  // 向part1中添加键为"hello"、值为"hello"的字符串键值对
    part1["hi"] = "hi";        
    
    // 创建JSON根对象root，作为主要数据容器
    Json::Value root;
    root["x"] = 100;                   // 向root添加键为"x"、值为100的整数键值对
    root["y"] = 200;                   
    root["op"] = '+';                  
    root["desc"] = "this is a \'+\' oper";  
    root["test"] = part1;              // 将子对象part1嵌套到root中，键为"test"
    
    // Json::FastWriter w;  // 声明紧凑格式的JSON写入器
    // string res = w.write(root);  // 用紧凑格式生成JSON字符串
    // cout << res << endl;  // 输出紧凑格式JSON

    Json::StyledWriter w; // 声明带格式的JSON写入器（会生成有缩进的易读格式）
    string res = w.write(root);  // 将root对象转换为带格式的JSON字符串
    cout << res << endl;  

    // 反序列化部分：将JSON字符串转换为C++可操作的JSON对象
    cout << "==================反序列化==================" << endl;
    
    Json::Value v;         // 用于存储解析后的JSON数据
    Json::Reader r;        // 声明JSON解析器对象
    
    // 将JSON字符串res解析到v对象中
    r.parse(res, v);
    
    // 从解析后的v对象中提取嵌套的"test"对象，存储到temp中
    Json::Value temp = v["test"];

    // 从解析后的JSON对象中提取数据并直接打印
    cout << v["x"].asInt() << endl;          // 提取"x"对应的值并转换为int类型输出
    cout << v["y"].asInt() << endl;          
    cout << v["op"].asInt() << endl;         // 提取"op"对应的值并转换为int类型（字符的ASCII值）输出
    cout << v["desc"].asString() << endl;    
    
    // 打印嵌套对象temp中的数据
    cout << "嵌套对象中的数据：" << endl;
    cout << temp["hello"].asString() << endl;  // 提取temp中"hello"对应的值并转换为string输出
    cout << temp["hi"].asString() << endl;     

    return 0;
}